package com.ymx.darling.executor.mapping.handler;

import com.ymx.darling.bean.entity.BeanInfoManager;
import com.ymx.darling.bean.sql.Statement;
import com.ymx.darling.exception.ResultSetException;
import com.ymx.darling.util.ObjectUtil;

import java.util.Map;
import java.util.Objects;

/**
 * 结果集策略处理器
 * 根据不同类型的Class返回不同的结果集处理器
 * @author 爱Java的小于
 */
public class ResultSetHandlerStrategy {
    /**
     * 根据传入的Class实例返回对应的映射器 具体映射规则如下 <br/>
     * 1.Map.class = MapResultSetHandler <br/>
     * 2.Object.class = ColumResultSetHandler <br/>
     * 3.(@Entity 或 @Entity)注解的类型 = BeanResultSetHandler <br/>
     * 4.null 或 其他类型 = null
     *
     * @param statement 语句封装类
     * @return NestedResultSetHandler 实现类
     */
    public ResultSetHandler<?> createResultSetHandler(Statement statement) {
        Class<?> module = statement.getModule();
        if (Objects.isNull(module)) {
            return null;

        } else if (Map.class.isAssignableFrom(module)) {
            return new MapResultSetHandler(statement);

        } else if (BeanInfoManager.isRegister(module)) {
            return new BeanResultSetHandler<>(statement);

        } else if (ObjectUtil.isSimpleType(module)){
            return new ObjectResultSetHandler<>(statement);

        } else {
            throw new ResultSetException(String.format("匹配不到'%s'类型的结果集映射器.原因:%s未注册或darling不支持该类型'", module.getName(), module.getName()));
        }
    }
}
